#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "io.h" 

#define NMax 1000        

int escopo [10];
int nivel;        
int L;         
int Raiz;       

struct {
    char  nome[10];      
    int   nivel;          
    char  atributo [10];   
    int   esq;            
    int   dir;            
} TabelaS [100];

void  Entrada_Bloco(void);
void  Erro(int numero);
void  Saida_Bloco(void);
void  Get_Entry(char name [10]);
void  Instala(char name [10], char atributo [10]);
void  imprimir(void);

int main(int argc, char *argv[] ) {
    L =  1;                                                      
    nivel = 0;               
    escopo[nivel] = 0;

    read("teste");

}


void Erro(int num)
{
    char opcao;
    switch (num) {
        case 1:
            printf("Tabela de Simbolos cheia\n");      break;
        case 2:
            printf("Este item nao foi encontrado\n");     break;
        case 3: 
            printf("Este item ja foi inserido\n");   break;
    }
}

void Entrada_Bloco()
{
    nivel++;
    if (nivel > NMax)
        Erro(1);
    else escopo[nivel] = 0;
}

void Saida_Bloco()
{
    if (escopo[nivel] != 0) L = escopo[nivel];
    nivel--;
}

void Get_Entry(char x[10])    
{
    int n, k, aux, achou;
    achou = 0;
    n = nivel;
    while ((n > 0)&&(achou==0))
    {
        k = escopo[n];
        while ((k != 0)&&(achou == 0))
        {
            aux = strcmp(x,TabelaS[k].nome);
            if (aux == 0) achou = 1;
            else if (aux < 0)       k = TabelaS[k].esq;
            else k = TabelaS[k].dir;
        }
        n--;
    }
    if (achou == 1)
    {
        printf("O item esta no nivel: %d\n", TabelaS[k].nivel);
        printf("              Indice: %u\n",k);
    }
    else Erro(2);
}

void Instala(char X[10], char atribut[10]) /* Instala o simbolo "X" com o atributo na Tabela de Simbolos */
{
    int S, i, k, aux;
    aux = 1;
    S = escopo[nivel];
    while (S != 0)    
    {
        i=S;
        aux = strcmp(X,TabelaS[S].nome);
        if (aux == 0)
        {
            S = 0;
            Erro(3);
        }
        else if (aux <0) S = TabelaS[S].esq;
        else S = TabelaS[S].dir;
    }
    if ((L< NMax + 1)&&(aux!=0))
    {
        TabelaS[L].nivel = nivel;
        aux = strlen(atribut);
        for (k = 0; k<= aux-1; k++) TabelaS[L].atributo[k] = atribut[k];
        TabelaS[L].esq = TabelaS[L].dir = 0;
        aux = strlen(X);
        for (k = 0; k<=(aux-1); k++)
            TabelaS[L].nome[k] = X[k];
        if (escopo[nivel] == 0) 
            escopo[nivel] = L;
        else 
        if (X < TabelaS[i].nome)
            TabelaS[i].esq = L;
        else TabelaS[i].dir = L;
        L++;
    }
}
void imprimir()
{
    int i;
    for (i=1; i<=L-1; i++)
    {
        printf("\n\nNome : ");
        printf("%s", TabelaS[i].nome);
        printf("\n");
        printf("Atributo : ");
        printf("%s", TabelaS[i].atributo);
        printf("\n");
        printf("Nivel : ");
        printf("%i", TabelaS[i].nivel);
        printf("\n");
        printf("Esquerdo : ");
        printf("%i", TabelaS[i].esq);
        printf("\n");
        printf("Direito : ");
        printf("%i", TabelaS[i].dir);
        printf("\n");
        printf("\n");
    }
}

